//
//  LCNetworkManager.swift
//  SwiftWeiBo
//
//  Created by LiCheng on 2017/2/12.
//  Copyright © 2017年 LiCheng. All rights reserved.
//

import UIKit

// 导入框架时 只需要导入文件名就可以
import AFNetworking


/// 请求类型枚举
enum LCHTTPMethod {
    case GET
    case POST
}

class LCNetworkManager: AFHTTPSessionManager {

    // MARK: - 单例
    //  - 第一次调用时执行闭包， 并将结果保存在 shared 常量中
    //  - 存储在静态常量区
    static let shared: LCNetworkManager = {

        // 实例化对象
        let instance = LCNetworkManager()

        // 添加响应反序列化支持的数据类型
        instance.responseSerializer.acceptableContentTypes?.insert("text/plain")

        // 返回对象
        return instance
    }()


    // MARK: - 属性
    /// 懒加载用户信息
    lazy var userAccount = LCUserAccount()

    /// 用户登录标记
    var userLogon: Bool {
        return userAccount.access_token != nil
    }
    

    // MARK: - 方法
    /// 带 token 的请求方法
    ///
    /// - Parameters:
    ///   - method:     请求类型 GET/POST 默认是 GET
    ///   - URLString:  请求路径
    ///   - parameters: 请求参数
    ///   - completion: 回调 （json：数据， isSuccess：是否成功）
    func tokenRequest(method: LCHTTPMethod = .GET, URLString: String, parameters: [String: AnyObject]?, completion: @escaping (_ json: Any?, _ isSuccess: Bool)->()) {

        // 0. 判断是否有 token
        guard let token = userAccount.access_token else {
            print("没有 token! 需要登录")

            // 1> 发送通知
            NotificationCenter.default.post(name: NSNotification.Name(LCUserShouldLoginNotification), object: nil)

            // 2> 完成回调
            completion(nil, false)
            return
        }

        // 1. 判断是否有参数
        var params = parameters
        if params == nil {
            // 实例化
            params = [String: AnyObject]()
        }

        // 2. 添加参数
        params!["access_token"] = token as AnyObject?

        // 3. 调用 request 发起请求
        request(URLString: URLString, parameters: params, completion: completion)
    }



    ///  封装 afn 的 get 和 post 请求
    ///
    /// - Parameters:
    ///   - method:     请求类型 GET/POST 默认是 GET
    ///   - URLString:  请求路径
    ///   - parameters: 请求参数
    ///   - completion: 回调 （json：数据， isSuccess：是否成功）
    func request(method: LCHTTPMethod = .GET, URLString: String, parameters: [String: AnyObject]?, completion: @escaping (_ json: Any?, _ isSuccess: Bool)->()) {


        /// 成功回调函数
        let isSuccess = { (task:URLSessionDataTask, json: Any?)->() in

            completion(json, true)
        }

        /// 失败回调函数
        let isFailure = { (task:URLSessionDataTask?, error: Error)->() in

            // 处理 token 过期 状态码:403
            if (task?.response as? HTTPURLResponse)?.statusCode == 403 {

                // 发送通知，提示用户再次登录
                //  - 本方法不知道谁调用， 谁接收到通知，谁就处理 token 过期
                NotificationCenter.default.post(name: NSNotification.Name(LCUserShouldLoginNotification), object: "overdueToken")
                print("token 过期")
            }
            print("请求失败\(error)")
            completion(nil, false)
        }

        if method == .GET {
            get(URLString, parameters: parameters, progress: nil, success: isSuccess, failure: isFailure)
        }else{
            post(URLString, parameters: parameters, progress: nil, success: isSuccess, failure: isFailure)
        }
    }



    /// 带 token 的请求方法
    ///
    /// - Parameters:
    ///   - method:     请求类型 GET/POST 默认是 GET
    ///   - URLString:  请求路径
    ///   - parameters: 请求参数
    ///   - success:    请求成功回调
    ///   - failure:    请求失败回调
//    func tokenRequest(method: LCHTTPMethod = .GET, URLString: String, parameters: [String: AnyObject]?, success: @escaping (_ json:Any?)->(), failure:@escaping (_ error:Error)->()) {
//
//        // 1. 判断是否有参数
//        var parmas = parameters
//        if parmas == nil {
//            // 实例化
//            parmas = [String: AnyObject]()
//        }
//
//        // 2. 添加参数
//        parmas!["access_token"] = accessToken as AnyObject?
//        
//        // 3. 调用 request 发起请求
//        request(URLString: URLString, parameters: parmas, success: success, failure: failure)
//    }


    ///  封装 afn 的 get 和 post 请求
    ///
    /// - Parameters:
    ///   - method:     请求类型 GET/POST 默认是 GET
    ///   - URLString:  请求路径
    ///   - parameters: 请求参数
    ///   - success:    请求成功回调
    ///   - failure:    请求失败回调
//    func request(method: LCHTTPMethod = .GET, URLString: String, parameters: [String: AnyObject]?, success: @escaping (_ json:Any?)->(), failure:@escaping (_ error:Error)->()) {
//
//
//        /// 成功回调函数
//        let isSuccess = { (task:URLSessionDataTask, json: Any?)->() in
//
//            success(json)
//        }
//
//        /// 失败回调函数
//        let isFailure = { (task:URLSessionDataTask?, error: Error)->() in
//
//            // 处理 token 过期 状态码:403
//            if (task?.response as? HTTPURLResponse)?.statusCode == 403 {
//
//                // FIXME: 发送通知，提示用户再次登录
//                //  - 本方法不知道谁调用， 谁接收到通知，谁就处理 token 过期
//                print("token 过期")
//            }
//            failure(error)
//        }
//
//        if method == .GET {
//            get(URLString, parameters: parameters, progress: nil, success: isSuccess, failure: isFailure)
//        }else{
//            post(URLString, parameters: parameters, progress: nil, success: isSuccess, failure: isFailure)
//        }
//    }

}
